package com.aaa.service.scl.impl;

import com.aaa.entity.MyPage;
import com.aaa.service.scl.SclService;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.aaa.entity.MyPage;
import com.aaa.entity.scl.Scl;
import com.aaa.service.scl.SclService;
import com.aaa.dao.scl.SclDao;


import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * (Scl)表服务实现类
 *
 * @author makejava
 * @since 2022-10-26 16:12:33
 */
@Service
public class SclServiceImpl implements SclService {
   /**
    * 服务对象
    */
   @Autowired
   private SclDao sclDao;

   /**
    * 分页查询所有题目
    * @return
    */
   @Override
   public PageInfo queryAll(MyPage myPage, Scl scl) {
      PageHelper.startPage(myPage.getPage(), myPage.getLimit());
      PageInfo pageInfo = new PageInfo(sclDao.selectAll());
      return pageInfo;
   }

   /**
    * 根据题目查询
    * @param sclname
    * @return
    */
   @Override
   public boolean queryByName(String sclname) {
      List<Scl> scls = sclDao.queryByName(sclname);
      System.out.println("scls = " + scls);
      if (scls.size()!=0){
         return true;
      }
      return false;
   }

   /**
    * 添加、修改数据
    * @param scl
    * @return
    */
   @Override
   public boolean addQuestion(Scl scl) {
      //根据题目名查询是否有数据
      List<Scl> scls = sclDao.queryByName(scl.getSclname());
      int i=-1;
      //判断

      if (scls.size()!=0){//存在数据
         //直接返回true
         return true;
      }else {
         //判断id是否为空
         if (scl.getId() == null) {
            //为空插如数据
            i = sclDao.insert(scl);
         } else {
            //不为空修改数据
            i = sclDao.updateByPrimaryKey(scl);
         }
         return false;
      }

   }

   /**
    * 删除题目
    * @param id
    * @return
    */
   @Override
   public boolean delScl(Integer id) {
      boolean b = sclDao.delScl(id);
      return b;
   }

   /**
    * 批量导入excel数据
    * @param file
    */
   @Override
   public void dealFile(MultipartFile file) {
      // 如果试题已经存在就不让再导入了
      int i = sclDao.selectCount(null);
      if(i>0){
         return;
      }else {
         // 将excel中的数据导入到数据库中
         InputStream is = null;
         try {
            is = file.getInputStream();
         } catch (IOException e) {
            e.printStackTrace();
         }
         //1.进行读取数据，TFpaSub是我的pojo类，
         //2.new FileListener(fileService)这个是监听器，主要用来读取数据的
         //3.特别注意的是fileService这个service，我上面有注入进去 @Autowired/@Resource，切记不要new会报错
         //EasyExcel.read(is, TFpaSub.class, new FileListener(fileService)).sheet("FPA性格测试").doRead();
         EasyExcel.read(is, Scl.class, new AnalysisEventListener<Scl>() {
            /**
             * 单次缓存的数据量
             */
            public static final int BATCH_COUNT = 100;
            /**
             * 临时存储
             */
            private List<Scl> cachedDataList = new ArrayList<>();
            @Override
            public void invoke(Scl data, AnalysisContext context) {
               cachedDataList.add(data);
               if (cachedDataList.size() >= BATCH_COUNT) {
                  saveData();
                  // 存储完成清理 list
                  cachedDataList = new ArrayList<>();
               }
            }
            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
               saveData();
            }

            /**
             * 加上存储数据库
             */
            private void saveData() {
//            log.info("{}条数据，开始存储数据库！", cachedDataList.size());
//            log.info("存储数据库成功！");
               save(cachedDataList);
            }
         }).sheet("scl症状自评").doRead();
      }
   }

   /**
    * excel批量添加
    * @param list
    */
   @Override
   public void save(List<Scl> list) {
      int i = sclDao.insertFtaSubjects(list);
      System.out.println("i = " + i);
   }

   /**
    * scldemo页面数据
    * @param myPage
    * @return
    */
   @Override
   public PageInfo getAll(MyPage myPage) {
      PageHelper.startPage(myPage.getPage(), myPage.getLimit());
      PageInfo pageInfo = new PageInfo(sclDao.selectAll());
      return pageInfo;
   }


}

